package cn.com.bluemoon.daps.common.sql.layer;

import com.alibaba.druid.DbType;
import com.alibaba.druid.sql.SQLUtils;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.parser.ParseException;

/**
 * jsqlParser 库进行解析
 *
 * @author Jarod.Kong
 * @date 2021/1/21 15:26
 */
@Slf4j
public class JSqlParserLayerCheck extends AbstractLayerCheck {
    /**
     * 解析SQL（单条）
     *
     * @param dbType
     * @param sql
     * @return
     */
    @Override
    public void checkSingle(DbType dbType, String sql, LayerCallback callback) {
        String message = null;
        try {
            CCJSqlParserUtil.parse(sql);
        } catch (Exception e) {
            log.error("SQL语法错误", e);
            message = jSqlExceptionHandler(e);
        }finally {
            callback.callback(message);
        }
    }

    /**
     * 异常处理
     * @param e
     * @return
     */
    private String jSqlExceptionHandler(Exception e) {
        String message = "语法未知错误";
        if (e.getMessage() != null) {
           return e.getMessage();
        } else {
            if (e.getCause() instanceof ParseException) {
                ParseException pe = (ParseException) e.getCause();
                return pe.getMessage();
            }
        }
        return message;
    }

    /**
     * 解析SQL（多条）
     *
     * @param dbType
     * @param sqls   多条（select 1 ; select 2)
     * @return 整条语句结果
     */
    @Override
    public void check(DbType dbType, String sqls, LayerCallback callback) {
        String message = null;
        try {
            CCJSqlParserUtil.parseStatements(sqls);
        } catch (Exception e) {
            log.error("SQL语法错误", e);
            message = jSqlExceptionHandler(e);
        }finally {
            callback.callback(message);
        }
    }

    @Override
    public String getFormatSql(String sql, DbType dbType, SQLUtils.FormatOption formatOption) {
        throw new UnsupportedOperationException("未实现");
    }

    @Override
    public String getFormatSql(String sql, DbType dbType) {
        throw new UnsupportedOperationException("未实现");
    }

    @Override
    public String getFormatMysqlSql(String sql) {
        throw new UnsupportedOperationException("未实现");
    }
}
